package com.netsdk.demo.customize;

import com.netsdk.demo.util.CaseMenu;
import com.netsdk.lib.NetSDKLib;
import com.netsdk.lib.ToolKits;
import com.netsdk.lib.structure.*;
import com.netsdk.lib.utils.Initialization;
import com.sun.jna.Memory;
import com.sun.jna.Pointer;
import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 291189
 * @version 1.0
 * @description GIP220929012 
 * @date 2022/10/26 16:13
 */
public class AttachGyroDemo extends Initialization {

    NetSDKLib.LLong lAttachHandle=new   NetSDKLib.LLong();

    static List<Pointer> pointers=new ArrayList<>();
    /**
     * 订阅陀螺仪数据接口
     */
    public void attachGyro(){

        String dwUser="{"+"ip:"+ipAddr+",port:"+port+"}";

// CLIENT_AttachGyro接口入参
        NET_IN_ATTACH_GYRO input=new NET_IN_ATTACH_GYRO();
        Pointer dwUserData
                = GetStringToPointer(dwUser, encode);
        input.cbNotifyGyroData=NotifyGyroData.getInstance();
        input.dwUser=dwUserData;
         Pointer inputPointer =new Memory(input.size());

         inputPointer.clear(input.size());

         ToolKits.SetStructDataToPointer(input,inputPointer,0);

       //CLIENT_AttachGyro接口出参
         NET_OUT_ATTACH_GYRO outPut=new NET_OUT_ATTACH_GYRO();

        Pointer outPutPointer =new Memory(outPut.size());

        outPutPointer.clear(outPut.size());

        ToolKits.SetStructDataToPointer(outPut,outPutPointer,0);

        lAttachHandle = netSdk.CLIENT_AttachGyro(loginHandle,inputPointer,outPutPointer,3000 );

        if(lAttachHandle.longValue()!=0){
            System.out.println(" CLIENT_AttachGyro Success");
            pointers.add(dwUserData);
        }else {
            System.out.println("CLIENT_AttachGyro Failed!LastError "+
                    ToolKits.getErrorCode());
        }
    }

    /**
     * 取消陀螺仪数据订阅接口
     */
    public void detachGyro(){

        if(lAttachHandle.longValue()!=0){

            boolean b
                    = netSdk.CLIENT_DetachGyro(lAttachHandle);

            if(b){
                System.out.println(" CLIENT_DetachGyro Success");

            }else {
                System.out.println("CLIENT_DetachGyro Failed!LastError "+
                        ToolKits.getErrorCode());
            }

        }


    }

    /**
     *   订阅陀螺仪数据接口回调函数原型, lAttachGyroHandle为CLIENT_AttachGyro接口的返回值
     */
    private static class NotifyGyroData implements NetSDKLib.fNotifyGyroData {
        private final File picturePath;
        private static NotifyGyroData instance;

        private NotifyGyroData() {
            picturePath = new File("./AnalyzerPicture/");
            if (!picturePath.exists()) {
                picturePath.mkdirs();
            }
        }

        public static NotifyGyroData getInstance() {
            if (instance == null) {
                synchronized (NotifyGyroData.class) {
                    if (instance == null) {
                        instance = new NotifyGyroData();
                    }
                }
            }
            return instance;
        }


        @Override
        public void invoke(NetSDKLib.LLong lAttachGyroHandle, Pointer pstuGyroDataInfo, Pointer dwUser) {

            String s = GetPointerDataToString(dwUser,encode);
            System.out.println("dwUser:"+s);
            NET_NOTIFY_GYRO_DATA_INFO msg=new NET_NOTIFY_GYRO_DATA_INFO();

            ToolKits.GetPointerData(pstuGyroDataInfo,msg);

            System.out.println("msg:"+msg.toString());


        }
    }

    public static Pointer GetStringToPointer(String src,String charset) {
        Pointer pointer = null;
        try {
            byte[] b = src.getBytes(charset);

            pointer = new Memory(b.length + 1);
            pointer.clear(b.length + 1);

            pointer.write(0, b, 0, b.length);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return pointer;
    }

    public static String GetPointerDataToString(Pointer pointer,String charset) {
        String str = "";
        if (pointer == null) {
            return str;
        }

        int length = 0;
        byte[] bufferPlace = new byte[1];

        for (int i = 0; i < 2048; i++) {
            pointer.read(i, bufferPlace, 0, 1);
            if (bufferPlace[0] == '\0') {
                length = i;
                break;
            }
        }

        if (length > 0) {
            byte[] buffer = new byte[length];
            pointer.read(0, buffer, 0, length);
            try {
                str = new String(buffer, charset).trim();
            } catch (UnsupportedEncodingException e) {
                return str;
            }
        }

        return str;
    }
    public void RunTest()
    {
        System.out.println("Run Test");
        CaseMenu menu = new CaseMenu();
        menu.addItem(new CaseMenu.Item(this , "订阅陀螺仪数据接口" , "attachGyro"));
        menu.addItem(new CaseMenu.Item(this , "取消陀螺仪数据订阅接口" , "detachGyro"));
        menu.run();
    }

    private static String ipAddr 			= "10.55.157.161";
    private static int    port 				= 37777;
    private static String user 			    = "admin";
    private static String password 		    = "admin123";

    public static void main(String[] args){
        InitTest(ipAddr, port, user, password);
        AttachGyroDemo attachGyroDemo=new AttachGyroDemo();
        attachGyroDemo.RunTest();
        LoginOut();
    }
}
